import numpy as np

# 假设数据（每行代表一个样本，每列代表一个指标）
data = np.array([
    [80, 70, 60, 75],
    [70, 85, 70, 80],
    [90, 75, 80, 90],
    [85, 80, 65, 85],
    [56, 75, 10, 96],
    [10, 69, 40, 25]
])

# 数据标准化（最小-最大标准化）
# def standardize(data):
#     min_vals = data.min(axis=0)
#     max_vals = data.max(axis=0)
#     range_vals = max_vals - min_vals
#     standardized_data = (data - min_vals) / range_vals
#     return standardized_data

# 数据标准化（最小-最大标准化，只除以最大值）
def standardize(data):
    max_vals = data.max(axis=0)
    standardized_data = data / max_vals
    return standardized_data

# 计算信息熵
def calculate_entropy(data):
    n_samples, n_features = data.shape
    epsilon = 1e-10  # 避免log(0)的情况
    p = data / data.sum(axis=0, keepdims=True)
    p = np.clip(p, epsilon, 1 - epsilon)  # 将概率值限制在[epsilon, 1-epsilon]范围内
    entropy = -np.sum(p * np.log(p), axis=0) / np.log(n_samples)
    return entropy

# 计算熵权
def calculate_entropy_weights(entropy):
    d = 1 - entropy
    return d / d.sum()

# 主观权重调整（这里可以保留，但如果不调整可以直接使用熵权）
def adjust_weights(entropy_weights, weight_adjustment_factors):
    adjusted_weights = entropy_weights * weight_adjustment_factors
    # 重新归一化权重
    adjusted_weights /= adjusted_weights.sum()
    return adjusted_weights

# 计算综合指数（考虑行权重）
def calculate_composite_index_with_row_weights(standardized_data, weights, row_weights):
    # 确保行权重被归一化
    row_weights = row_weights / row_weights.sum()
    # 计算加权标准化数据的平均值（按行加权）
    weighted_mean = np.average(standardized_data, axis=0, weights=row_weights)
    # 计算综合指数
    composite_index = np.dot(weighted_mean, weights) * 100  # 乘以100是为了得到0-100范围的指数值
    return composite_index

# 主函数
def main():
    # 标准化数据
    standardized_data = standardize(data)
    # 计算信息熵
    entropy = calculate_entropy(standardized_data)
    # 注意：这里我们可能需要对熵的计算进行调整，因为标准化后的数据可能不再适合直接用于熵的计算
    # 但为了示例，我们暂时保留这个步骤，并在后续注意可能的改进
    # 计算熵权
    entropy_weights = calculate_entropy_weights(entropy)
    # 设置权重调整系数（例如，分别为四列指标设置1.0, 1.1, 1.2, 1.3的调整系数）
    weight_adjustment_factors = np.array([1.0, 1.0, 1.0, 1.2])
    # 调整权重
    adjusted_weights = adjust_weights(entropy_weights, weight_adjustment_factors)
    # 设置行权重（例如，每个样本的权重）
    row_weights = np.array([0.2, 0.1, 0.3, 0.1, 0.2, 0.1])
    # 计算综合指数（考虑行权重）
    composite_index = calculate_composite_index_with_row_weights(standardized_data, adjusted_weights, row_weights)
    # 输出结果
    print("标准化数据：\n", standardized_data)
    print("信息熵：\n", entropy)
    print("熵权：\n", entropy_weights)
    print("调整后的权重：\n", adjusted_weights)
    print("行权重：\n", row_weights)
    print("综合指数（0-100范围）：", composite_index)

if __name__ == "__main__":
    main()